iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
2
Security

資安0~100K只要30天系列 第 12

Day 12 - PHP 偽協議 (一)

  • 分享至 

  • xImage
  •  

沒錯又是 PHP

今天要講的內容是一個在 PHP 中很重要的功能
因為不論是要存取檔案
還是遠端請求網頁的內容
都離不開這項元件
那就是 "協議流"

在官方的說明文件中
一共提供了以下幾種

今天會講幾個重要且常用的協議
也因為這些協議的使用不當
造成了 LFI (Local File Include), RFI(Remote File Include)
甚至最後有可能造成 RCE (Remote Code Excution) 導致整台主機淪陷

那在使用這些協議時有兩個重要的設定要注意
接下來介紹的協議都會與這兩項相關

  • allow_url_fopen
    • 允許透過 URL 開啟文件
    • default : 開
  • allow_url_include
    • 允許透過 URL 包含文件
    • default : 關

file://

這也是預設在讀取本地檔案時所用的協議
只是通常在函數中的實作會有些許不同
而在這個協議最原始的用法中
只能使用絕對路徑來存取

  • 用法
    • file://<path>
include($_GET['path']);

舉個例子來說
path 這個變數沒有經過任何過濾就被放進讀取
這樣我們就可以存取任意一個你知道路徑的檔案
這是非常危險的一件事 稱為 LFI
因為一些本來應該只能夠看到網頁跟目錄底下的檔案
如今可以透過這個方式存取到其他位置
等於你的主機重要資訊會被看光光

而 linux 底下有個大家都可以看的檔案 /etc/passwd
但不存在網頁根目錄底下
這通常會被用來檢查是否存在 LFI
因此會寫成 ?path=file:///etc/passwd
要注意 file 後面有三個 /
其中前兩個是 file 協議本身的
第三個是絕對路徑的

php://

php://input

  • 需開啟 allow_url_include
  • 用法
    • 預設會去讀取 post body 中的資料

php://filter

  • 用法
    • php://filter/read=/resource=/
  • 參數
    • read
      • 以什麼方式讀取
    • resource
      • 要讀取的檔案

其中 read 這個參數又有許多編碼方式可以選擇

  • convert.base64-<encode/decode>
  • string.rot13
  • string.toupper
  • string.tolower

這個協議通常被攻擊者利用在要取得 PHP 原始碼時會使用的
因為 PHP 語法會被 web server 解析至前端時隱藏起來
剛好這個協議的編碼特性
可以將讀取到的原始碼經過編碼後輸出從而繞過

例如有一份檔案 index.php

<?php
echo 'Hello';
?>

我們可以使用 php://read=convert.base64-encode/resource=index.php
而將原始碼輸出成 PD9waHAKZWNobyAnSGVsbG8nOwo/Pg==
只要將這串字串進行 base64 解碼後
我們就得到原始碼了


上一篇
Day 11 - PHP 黑魔法 (二)
下一篇
Day 13 - PHP 偽協議 (三)
系列文
資安0~100K只要30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言